// 闭包：函数嵌套时，内层函数访问外层函数的局部变量
// 闭包 = 内层函数 + 外层函数的变量
// 作用：实现数据的私有化，避免全局污染

// 这个现象就是闭包
/**
 * 1.一旦发生闭包，意味着外层函数的局部变量不会随着函数的结束而释放，会长期存在一个叫 cloure （闭包）的空间中（本该被释放的变量，无法及时释放，会存在闭包空间中）
 * 2.闭包会导致内存泄漏，但这种内存泄漏是必要的
 */
function outer(){
    let a = 10
    function inner(){
        console.log(a) // 10
    }
    inner()
}
outer()


// 需求：统计函数的调用次数
/**
 * count 全局变量 所有人都可以随意访问，这种数据叫做公共数据，及其容易篡改，导致出现一些严重的 bug
 */
let count = 0
function fn(){
    count++
    console.log(`调用了${count}次`)
}
fn()

// 使用 闭包 解决以上问题   实现变量的私有化，让外面的人无法修改内部的变量 
function getCount(){
    let count = 0
    function fn(){
        count++
        console.log(`调用了${count}次`)
    }
    // 将函数作为返回值
    return fn
}
let result =  getCount()
result()